/*
Copyright (c) [2019年5月1日] [吴超]
[MBT_studio] is licensed under Mulan PSL v2.
You can use this software according to the terms and conditions of the Mulan PSL v2.
You may obtain a copy of Mulan PSL v2 at:
http://license.coscl.org.cn/MulanPSL2
THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
See the Mulan PSL v2 for more details.
*/
#pragma once

#include "Context/当前默认操作数据.h"

#include <lua.hpp>



// 代码元素类型
enum class CodeElementType {
	FUNCTION,
	VARIABLE,
	TYPE,
	STRUCT,
	TABLE,

	KEYWORD,		// 新增：关键字
	CONTROL_STRUCT,	// 新增：控制结构

	UNKNOWN
};

// 判断当前上下文是否在特定代码块中
enum class ContextType {
	NORMAL,
	FUNCTION_DEFINITION,
	IF_BLOCK,
	IF_THEN_BLOCK,     
	LOOP_BLOCK,

	STRING_CONTEXT,    // 字符串内部
	COMMENT_CONTEXT    // 注释内部
};

// 代码元素信息
struct CodeElement {
	std::string		name;
	CodeElementType type;
	std::string		parent;  // 用于结构体成员或表字段

	CodeElement(std::string n, CodeElementType t, std::string p = "") : name(n), type(t), parent(p) {}
};

// 补全项结构体
struct CompletionItem {
	std::string	content;	// 补全内容
	int32		priority;	// 优先级
	std::string	type;		// 类型：function, variable, type, struct, etc.

	// 构造函数参数明确指定类型
	CompletionItem(const std::string& c, int p, const std::string& t) : content(c), priority(p), type(t) {}
};

// 模块信息结构
struct ModuleInfo {
	std::string					name;        // 模块名
	std::vector<std::string>	members;     // 模块成员
	std::vector<std::string>	submodules;  // 子模块
	ModuleInfo(std::string n) : name(n) {}
};


// 工具函数声明
std::string trim(const std::string& s);
std::string removeSpaces(const std::string& s);
int32 fastPrefixMatch(const std::string& prefix, const std::string& target);

// 函数提取和检测函数声明

bool isInFunctionDefinition(const std::string& 已有代码, std::string& 函数名);
bool isFunctionExcluded(const std::string& functionName, const std::unordered_set<std::string>& definedFunctions, bool excludeInternal);


std::unordered_set<std::string> extractDefinedFunctions(const std::string& code);
std::unordered_set<std::string> extractDefinedFunctions(const S_文档文本& doc);
// 核心补全函数声明
std::vector<std::string> getGeneralCompletions(const std::string& input, const std::string& code, const std::unordered_set<std::string>& definedFunctions, bool excludeInternal);
std::vector<std::string> getMemberCompletions(const std::string& 已有代码, const std::string& 当前输入);

//std::vector<std::string> f_lua_代码提示补全(const std::string& input, const std::string& code);


